package com.dp.singleton;

/**
 * <p>Title: 静态内部类形式</p>
 * <p>Description:
 * @author 公众号：小白架构师养成记
 * @version 1.0
 * @date 2020/6/30
 */
public class StaticSingleton {

    /***
     * private 避免类在外部被实例化
     *
     * 通过静态内部类的方式实现单例模式是线程安全的，同时静态内部类不会在Singleton类加载时就加载，
     * 而是在调用getInstance()方法时才进行加载，达到了懒加载的效果。
     *
     * 似乎静态内部类看起来已经是最完美的方法了，其实不是，可能还存在反射攻击或者反序列化攻击。 不建议使用
     */
    private static StaticSingleton getInstance() {
        return StaticSingleton04Utils.staticSingleton04;
    }

    /***
     * 创建内部类
     */
    private static class StaticSingleton04Utils {
        // 实例化对象
        private static StaticSingleton staticSingleton04 = new StaticSingleton();
    }

    /****
     * 模拟多线程下并发测试
     * @param ags
     */
    public static void main(String[] ags){
        long start = System.currentTimeMillis();
        for (int i = 0; i < 1000; i++) {
            new Thread(new Runnable() {
                public void run() {
                    StaticSingleton lazySingleton03 = StaticSingleton.getInstance();
                    System.out.println(Thread.currentThread().getName() + lazySingleton03);
                }
            }).start();
        }
        long end = System.currentTimeMillis();
        System.out.println("总耗时：" + (end - start));
    }
}
